home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Graphics / Plotting / NXplot3d.3.2 / Source / PlotShape.m < prev    next >
Encoding:
Text File  |  1994-09-26  |  13.2 KB  |  474 lines

  1. #import "Plot3DView.h"
  2. #import "PlotShape.h"
  3. #import <ri/ri.h>
  4. #import <math.h>
  5.  
  6. #define SC .05
  7. #define SCP1 SC/1.732
  8. #define SCP2 SC/.866
  9. #define SCP3 SC/2.45
  10. #define SCP4 SC/1.633-SCP3
  11.  
  12. #define SWAPP(a,b) { float f; int i; for (i=0; i<3; i++) { f=a[i]; a[i]=b[i]; b[i]=f; } }
  13.  
  14. /* used to position z axis label */
  15. struct ZAXTAB { float x,y; int d; };
  16.  
  17. @implementation PlotShape:N3DShape
  18. - renderSelf:(RtToken)context
  19. {
  20. int i,j,cm;
  21. float x,y,z,xpm,ypm,a,b;
  22. struct ZAXTAB zaxtab[8] = { {1.0,1.0,0},{-1.0,-1.0,1},{-1.0,1.0,1},{1.0,-1.0,0} ,{-1.0,-1.0,0},{1.0,1.0,1},{1.0,-1.0,1},{-1.0,1.0,0} };
  23. static RtPoint square[4]= {{-1.0,-1.0,-1.01},{1.0,-1.0,-1.01},{1.0,1.0,-1.01},{-1.0,1.0,-1.01}};
  24. static RtFloat squareST[8]= { 0.0,0.0,1.0,0.0,1.0,1.0,0.0,1.0 };
  25. static RtPoint zsquare[4]= {{-1.0,-1.0,0},{1.0,-1.0,0},{1.0,1.0,0},{-1.0,1.0,0}};
  26. static RtPoint sq1[4]= {{-1.0,-1.0,-1.0},{-1.0,1.0,-1.0},{-1.0,1.0,1.0},{-1.0,-1.0,1.0}};
  27. static RtPoint sq2[4]= {{-1.0,1.0,-1.0},{-1.0,1.0,1.0},{1.0,1.0,1.0},{1.0,1.0,-1.0}};
  28. static RtPoint sq3[4]= {{1.0,1.0,1.0},{1.0,1.0,-1.0},{1.0,-1.0,-1.0},{1.0,-1.0,1.0}};
  29. static RtPoint sq4[4]= {{-1.0,-1.0,-1.0},{1.0,-1.0,-1.0},{1.0,-1.0,1.0},{-1.0,-1.0,1.0}};
  30. RtPoint scaX[4] = {{-1.0,-1.0,-1.0},{1.0,-1.0,-1.0},{1.0,-1.0,-1.0},{-1.0,-1.0,-1.0} };
  31. RtPoint scaY[4] = {{-1.0,-1.0,-1.0},{-1.0,1.0,-1.0},{-1.0,1.0,-1.0},{-1.0,-1.0,-1.0} };
  32. static RtPoint scaZ[4];
  33. RtFloat scaST[8] = { 0,1.0,1.0,1.0,1.0,0.75,0,0.75 };
  34. static RtFloat scaSTZ[8] = { 1.0,0.5,1.0,0,0,0,0,0.5 };
  35. static RtPoint Box[8] = {{-SC,-SC,-SC},{-SC,-SC,SC},{-SC,SC,SC},{-SC,SC,-SC}, {SC,-SC,-SC},{SC,-SC,SC},{SC,SC,SC},{SC,SC,-SC}};
  36. static RtInt BoxP[24] = {0,1,2,3,0,1,5,4,4,5,6,7,2,3,7,6,1,5,6,2,0,3,7,4};
  37. static RtInt BoxV[6]={4,4,4,4,4,4};
  38. static RtPoint Pyr[4] = {{0,-SCP2,-SCP4},{-SC,SCP1,-SCP4},{SC,SCP1,-SCP4}, {0,0,SCP4}};
  39. static RtInt PyrP[12] = {0,1,2,0,1,3,0,2,3,1,2,3};
  40. static RtInt PyrV[4] = {3,3,3,3};
  41. static RtColor bgCol = {1.0,1.0,1.0};
  42. static RtColor dCol = { 1.0,1.0,1.0 };
  43. static RtColor opac = { .2,.2,.2 };
  44. static RtColor cylCol = { .9,.9,.9 };
  45. static RtPoint bsquare[4]= {{-100.0,-100.0,-40.0},{100.0,-100.0,-40.0},{100.0,100.0,-40.0},{-100.0,100.0,-40.0}};
  46. RtColor Alpha;
  47. RtFloat *SZ;
  48. char tmaps[100],*tmap;
  49. char home[60];
  50.  
  51. sprintf(home,"/tmp/%s",getenv("USER"));
  52. if (getenv("USER")==NULL) strcpy(home,"/tmp"); 
  53. sprintf(tmaps,"%s/plot3d.tx",home);
  54. tmap=tmaps;
  55.  
  56.  
  57. RiDeclare("texname","uniform string");
  58. RiDeclare("Cst","uniform float");
  59. RiDeclare("Csp","uniform float");
  60.  
  61. RiSurface("constant",RI_NULL);
  62. if (mode>=4) {
  63.     RiTransformBegin();
  64.     RiRotate(chi,0,0,1.0);
  65.     RiRotate(-theta+90.0,1.0,0,0);
  66.     RiColor(bgCol);
  67.     RiPolygon(4,RI_P,(RtPointer)bsquare,RI_NULL);
  68.     RiTransformEnd();
  69. }
  70.  
  71. RiSurface("matte",RI_NULL);
  72. RiColor(flagcol[1]);
  73. /* FLOOR */
  74. if (flags&2) {
  75.     if (mode>=4 && Omode&OVER_base) {
  76.     /*    RiTextureCoordinates(0,0,.5,0,0,.5,.5,.5);*/
  77.         RiSurface("texmap",(RtToken)"texname",(RtPointer)&tmap,RI_NULL);
  78.     }
  79.     RiPolygon(4,RI_P,(RtPointer)square,RI_ST,(RtPointer)squareST,RI_NULL);
  80. }
  81. RiSurface("matte",RI_NULL);
  82. RiColor(dCol);
  83.  
  84.  
  85. if (chi>90.0&&chi<270.0) ypm=-1.0;
  86. else ypm=1.0;
  87. if (chi<180.0) xpm=-1.0;
  88. else xpm=1.0;
  89.  
  90. /* Backs */
  91. if (flags&4) {
  92.     RiColor(flagcol[2]);
  93.     if (chi>90.0&&chi<270.0) RiPolygon(4,RI_P,(RtPointer)sq4,RI_NULL); 
  94.     else RiPolygon(4,RI_P,(RtPointer)sq2,RI_NULL);
  95.     if (chi<180.0) RiPolygon(4,RI_P,(RtPointer)sq1,RI_NULL);
  96.     else RiPolygon(4,RI_P,(RtPointer)sq3,RI_NULL);
  97.     if (flags&8) {
  98.         RiColor(flagcol[3]);
  99.         RiTransformBegin();
  100.         RiTranslate(xpm,0.0,0.0);
  101.         RiRotate(90.0,1.0,0.0,0.0);
  102.         RiTranslate(0,tickmin[2],0.0);
  103.         for (z=tickmin[2]; z<1.0; z+=tickstp[2]) {
  104.             RiCylinder(.007,-1.0,1.0,360.0,RI_NULL);
  105.             RiTranslate(0,tickstp[2],0);
  106.         }
  107.         RiTransformEnd();
  108.         RiTransformBegin();
  109.         RiTranslate(0.0,ypm,0.0);
  110.         RiRotate(90.0,0.0,1.0,0.0);
  111.         RiTranslate(-tickmin[2],0,0);
  112.         for (z=tickmin[2]; z<1.0; z+=tickstp[2]) {
  113.             RiCylinder(.007,-1.0,1.0,360.0,RI_NULL);
  114.             RiTranslate(-tickstp[2],0,0);
  115.         }
  116.         RiTransformEnd();
  117.     }
  118. }
  119. /* Axes */
  120. if (flags&1 && data[0].sym!=6) {
  121.     RiColor(flagcol[0]);
  122.     RiTransformBegin();
  123.     RiTranslate(-1.0,-1.0,-1.0);
  124.     RiCylinder(.015,0.0,2.0,360.0,RI_NULL);
  125.     RiTransformEnd();
  126.     RiTransformBegin();
  127.     RiRotate(-90.0,0,1.0,0.0);
  128.     RiTranslate(-1.0,-1.0,-1.0);
  129.     RiCylinder(.015,0.0,2.0,360.0,RI_NULL);
  130.     RiTransformEnd();
  131.     RiTransformBegin();
  132.     RiRotate(90.0,1.0,0.0,0.0);
  133.     RiTranslate(-1.0,-1.0,-1.0);
  134.     RiCylinder(.015,0.0,2.0,360.0,RI_NULL);
  135.     RiTransformEnd();
  136. }
  137. else if (flags&1) {
  138.     RiColor(flagcol[0]);
  139.     RiTransformBegin();
  140.     RiCylinder(.015,-1.0,1.0,360.0,RI_NULL);
  141.     RiTransformEnd();
  142.     RiTransformBegin();
  143.     RiRotate(-90.0,0,1.0,0.0);
  144.     RiCylinder(.015,-1.0,1.0,360.0,RI_NULL);
  145.     RiTransformEnd();
  146.     RiTransformBegin();
  147.     RiRotate(90.0,1.0,0.0,0.0);
  148.     RiCylinder(.015,-1.0,1.0,360.0,RI_NULL);
  149.     RiTransformEnd();
  150. }
  151.  
  152. /*else if (flags&1) {
  153.     RiColor(flagcol[0]);
  154.     RiLine(2,RI_P,axes1,RI_NULL);
  155.     RiLine(2,RI_P,axes2,RI_NULL);
  156.     RiLine(2,RI_P,axes3,RI_NULL);
  157. }*/
  158. /* Ticks */
  159. if (flags&8) {
  160.     RiColor(flagcol[0]);
  161.     RiTransformBegin();
  162.     RiRotate(-90.0,0,1.0,0.0);
  163.     RiTranslate(-1.0,-ypm,-1.0);
  164.     RiCylinder(.015,0.0,2.0,360.0,RI_NULL);
  165.     RiTransformEnd();
  166.     RiTransformBegin();
  167.     RiRotate(90.0,1.0,0.0,0.0);
  168.     RiTranslate(-xpm,-1.0,-1.0);
  169.     RiCylinder(.015,0.0,2.0,360.0,RI_NULL);
  170.     RiTransformEnd();
  171.  
  172.     RiColor(flagcol[3]);
  173.     RiTransformBegin();
  174.     RiTranslate(0,-ypm,-1.0);
  175.     RiRotate(90,0,1.0,0);
  176.     for (x=tickmin[0]; x<1.0; x+=tickstp[0]) RiDisk(x,.03,360.0,RI_NULL);
  177.     RiTransformEnd();
  178.     RiTransformBegin();
  179.     RiTranslate(-xpm,0.0,-1.0);
  180.     RiRotate(90,1.0,0,0);
  181.     for (x=tickmin[1]; x<1.0; x+=tickstp[1]) RiDisk(x,.03,360.0,RI_NULL);
  182.     RiTransformEnd();
  183.     if (!(flags&4)) {
  184.         RiTranslate(-1.0,-1.0,0.0);
  185.         for (x=tickmin[2]; x<1.0; x+=tickstp[2]) 
  186.             RiDisk(x,.03,360.0,RI_NULL);
  187.         RiTranslate(1.0,1.0,0.0);
  188.     }
  189. }
  190. /* Labels */
  191. if (flags&32 && mode>=4) {
  192.     if (ypm<0) { SWAPP(scaX[0],scaX[1]); SWAPP(scaX[2],scaX[3]); }
  193.     if (xpm>0) { SWAPP(scaY[0],scaY[1]); SWAPP(scaY[2],scaY[3]); }
  194.     scaX[0][1]=scaX[1][1]=scaX[2][1]=scaX[3][1]=-ypm;
  195.     scaY[0][0]=scaY[1][0]=scaY[2][0]=scaY[3][0]=-xpm;
  196.     scaX[0][2]-=.5/aspect;
  197.     scaX[1][2]-=.5/aspect;
  198.     scaY[0][2]-=.5/aspect;
  199.     scaY[1][2]-=.5/aspect;
  200.     i=floor(chi/45.0);
  201.     scaZ[0][2]=scaZ[1][2]=-1.0;
  202.     scaZ[2][2]=scaZ[3][2]=1.0;
  203.     scaZ[0][0]=scaZ[3][0]=zaxtab[i].x;
  204.     scaZ[1][0]=scaZ[2][0]=zaxtab[i].x;
  205.     scaZ[0][1]=scaZ[3][1]=zaxtab[i].y;
  206.     scaZ[1][1]=scaZ[2][1]=zaxtab[i].y;
  207.     if (i%2==0) {
  208.         scaZ[1][zaxtab[i].d]*=(1.0+aspect);
  209.         scaZ[2][zaxtab[i].d]*=(1.0+aspect);
  210.     }
  211.     else {
  212.         scaZ[0][zaxtab[i].d]*=(1.0+aspect);
  213.         scaZ[3][zaxtab[i].d]*=(1.0+aspect);
  214.     }
  215.     sprintf(tmaps,"%s/plot3dxyz.tx",home);
  216.     
  217.     x=1.05/ambient; y=0.0;
  218.     RiSurface("texmap",(RtToken)"texname",(RtPointer)&tmap,RI_KA,(RtPointer)&x,RI_KD,(RtPointer)&y,RI_NULL);
  219.     RiPolygon(4,RI_P,(RtPointer)scaX,RI_ST,(RtPointer)scaST,RI_NULL);
  220.  
  221.     scaST[1]=scaST[3]=.75;
  222.     scaST[5]=scaST[7]=.5;
  223.     RiPolygon(4,RI_P,(RtPointer)scaY,RI_ST,(RtPointer)scaST,RI_NULL);
  224.  
  225.     RiPolygon(4,RI_P,(RtPointer)scaZ,RI_ST,(RtPointer)scaSTZ,RI_NULL);
  226.  
  227.     sprintf(tmaps,"%s/plot3d.tx",home);
  228.     RiSurface("matte",RI_NULL);
  229. }
  230. /* Planes */
  231. if (flags&16) {
  232.     RiColor(flagcol[4]);
  233.     RiOpacity(opac);
  234.     RiTransformBegin();
  235.     RiTranslate(0,0,tickmin[2]);
  236.     for (z=tickmin[2]; z<1.0; z+=tickstp[2]) {
  237.         RiPolygon(4,RI_P,(RtPointer)zsquare,RI_NULL);
  238.         RiTranslate(0,0,tickstp[2]);
  239.     }
  240.     RiTransformEnd();
  241.     RiOpacity(dCol);
  242. }
  243.  
  244. if (data==NULL) return self;
  245. for (i=0; i<MAXSETS; i++) {
  246.     if (data[i].sym<0) continue;
  247.     if ((mode&3)>=2) RiColor(data[i].mapcol[0]);
  248.     else RiColor(data[i].mapcol[0]);
  249.     Alpha[0]=Alpha[1]=Alpha[2]=data[i].alpha;
  250.     RiOpacity(Alpha);
  251.  
  252.     cm=data[i].mapmode;
  253.     switch(data[i].sym) {
  254.     case 0:
  255.         for (j=0; j<data[i].ndata; j++) {
  256.             x=data[i].data[j].x;
  257.             y=data[i].data[j].y;
  258.             z=data[i].data[j].z;
  259.             if (cm) RiColor(data[i].color[j]);
  260.             RiTransformBegin();
  261.             RiTranslate(x,y,z);
  262.             RiPointsPolygons(6,BoxV,BoxP,RI_P,(RtPointer)Box,RI_NULL);
  263.             RiTransformEnd();             
  264.           }
  265.         break;
  266.     case 1:
  267.         for (j=0; j<data[i].ndata; j++) {
  268.             x=data[i].data[j].x;
  269.             y=data[i].data[j].y;
  270.             z=data[i].data[j].z;
  271.             if (cm) RiColor(data[i].color[j]);
  272.             RiTransformBegin();
  273.             RiTranslate(x,y,z);
  274.             RiPointsPolygons(4,PyrV,PyrP,RI_P,(RtPointer)Pyr,RI_NULL);
  275.             RiTransformEnd();             
  276.           }
  277.         break;
  278.     case 2:
  279.         for (j=0; j<data[i].ndata; j++) {
  280.             x=data[i].data[j].x;
  281.             y=data[i].data[j].y;
  282.             z=data[i].data[j].z;
  283.             if (cm) RiColor(data[i].color[j]);
  284.             RiTransformBegin();
  285.             RiTranslate(x,y,z);
  286.             RiSphere(SC,-SC,SC,360.0,RI_NULL);
  287.             RiTransformEnd();             
  288.           }
  289.         break;
  290.     case 3:
  291.         for (j=0; j<data[i].ndata; j++) {
  292.             x=data[i].data[j].x;
  293.             y=data[i].data[j].y;
  294.             z=data[i].data[j].z;
  295.             if (cm) RiColor(data[i].color[j]);
  296.             RiTransformBegin();
  297.             RiTranslate(x,y,z);
  298.             RiTorus(SC,SC/3.0,0,360.0,360.0,RI_NULL);
  299.             RiTransformEnd();             
  300.           }
  301.         break;
  302.     case 4:
  303.         a=1.0/(float)data[i].nx;
  304.         b=1.0/(float)data[i].ny;
  305.         for (j=0; j<data[i].ndata; j++) {
  306.             x=data[i].data[j].x;
  307.             y=data[i].data[j].y;
  308.             z=data[i].data[j].z;
  309.             if (x-a<-1.0||x+a>1.0||y-b<-1.0||y+b>1.0) continue;    /* clip */
  310.             RiTransformBegin();
  311.             RiTranslate(x,y,0);
  312.             RiScale(a,b,1.0);
  313.             RiColor(cylCol);
  314.             RiCylinder(1.0,-1.0,z,360.0,RI_NULL);
  315.             if (cm) RiColor(data[i].color[j]);
  316.             RiDisk(z,1.0,360.0,RI_NULL);
  317.             RiTransformEnd();             
  318.           }
  319.         break;
  320.     case 5:
  321.         if ((data[i].flag&7)==F_SDATA) break;    /* no mesh in sfile mode */
  322.         if (data[i].nx*data[i].ny!=data[i].ndata) break;
  323.         if (mode>=4 && Omode&OVER_csurf) { 
  324.             SZ=malloc(data[i].ndata*sizeof(RtFloat));
  325.             for (j=0; j<data[i].ndata; j++) SZ[j]=(data[i].data[j].z+1.0)/2.0;
  326.             RiSurface("contour",(RtToken)"Cst",(RtPointer)&Cst, (RtToken)"Csp",(RtPointer)&Csp,RI_NULL);
  327.             if (cm) 
  328.                 RiPatchMesh(RI_BILINEAR,data[i].nx,RI_NONPERIODIC,data[i].ny,
  329.                 RI_NONPERIODIC,RI_P,(RtPointer)data[i].data,
  330.                 RI_S,(RtPointer)SZ,RI_CS,(RtPointer)data[i].color,RI_NULL);
  331.             else 
  332.                 RiPatchMesh(RI_BILINEAR,data[i].nx,RI_NONPERIODIC,data[i].ny,
  333.                 RI_NONPERIODIC,RI_P,(RtPointer)data[i].data,
  334.                 RI_S,(RtPointer)SZ,RI_NULL);
  335.             free(SZ);
  336.         }
  337.         else if (mode>=4 && Omode&OVER_surf) {
  338.             RiSurface("texmap",(RtToken)"texname",(RtPointer)&tmap,RI_NULL);
  339.             RiPatchMesh(RI_BILINEAR,data[i].nx,RI_NONPERIODIC,data[i].ny,
  340.                 RI_NONPERIODIC,RI_P,(RtPointer)data[i].data,RI_NULL);
  341.         }
  342.         else if (cm)
  343.             RiPatchMesh(RI_BILINEAR,data[i].nx,RI_NONPERIODIC, 
  344.             data[i].ny,RI_NONPERIODIC,RI_P,(RtPointer)data[i].data,RI_CS,
  345.             (RtPointer)data[i].color,RI_NULL);
  346.         else RiPatchMesh(RI_BILINEAR,data[i].nx,RI_NONPERIODIC,data[i].ny,
  347.             RI_NONPERIODIC,RI_P,(RtPointer)data[i].data,RI_NULL);
  348.         break;
  349.     case 6:
  350.         if ((data[i].flag&7)==F_SDATA) break;    /* no mesh in sfile mode */
  351.         if (data[i].nx*data[i].ny!=data[i].ndata) break;
  352.         if (mode>=4 && Omode&OVER_csurf) { 
  353.             SZ=malloc(data[i].ndata*sizeof(RtFloat));
  354.             for (j=0; j<data[i].ndata; j++) SZ[j]=(data[i].data[j].z+1.0)/2.0;
  355.             RiSurface("contour",(RtToken)"Cst",(RtPointer)&Cst, (RtToken)"Csp",(RtPointer)&Csp,RI_NULL);
  356.             if (cm) 
  357.                 RiPatchMesh(RI_BILINEAR,data[i].nx,RI_NONPERIODIC,data[i].ny,
  358.                 RI_NONPERIODIC,RI_P,(RtPointer)data[i].Sdata,
  359.                 RI_S,(RtPointer)SZ,RI_CS,(RtPointer)data[i].color,RI_NULL);
  360.             else 
  361.                 RiPatchMesh(RI_BILINEAR,data[i].nx,RI_NONPERIODIC,data[i].ny,
  362.                 RI_NONPERIODIC,RI_P,(RtPointer)data[i].Sdata,
  363.                 RI_S,(RtPointer)SZ,RI_NULL);
  364.             free(SZ);
  365.         }
  366.         else if (mode>=4 && Omode&OVER_surf) {
  367.             RiSurface("texmap",(RtToken)"texname",(RtPointer)&tmap,RI_NULL);
  368.             RiPatchMesh(RI_BILINEAR,data[i].nx,RI_NONPERIODIC,data[i].ny,
  369.                 RI_NONPERIODIC,RI_P,(RtPointer)data[i].Sdata,RI_NULL);
  370.         }
  371.         else if (cm)
  372.             RiPatchMesh(RI_BILINEAR,data[i].nx,RI_NONPERIODIC, 
  373.             data[i].ny,RI_NONPERIODIC,RI_P,(RtPointer)data[i].Sdata,RI_CS,
  374.             (RtPointer)data[i].color,RI_NULL);
  375.         else RiPatchMesh(RI_BILINEAR,data[i].nx,RI_NONPERIODIC,data[i].ny,
  376.             RI_NONPERIODIC,RI_P,(RtPointer)data[i].Sdata,RI_NULL);
  377.         break;
  378.     }
  379. }
  380. return self;
  381. }
  382.  
  383. -setTicks:(RtPoint)Min :(RtPoint)Step
  384. {
  385. tickmin[0]=Min[0];
  386. tickmin[1]=Min[1];
  387. tickmin[2]=Min[2];
  388. tickstp[0]=Step[0];
  389. tickstp[1]=Step[1];
  390. tickstp[2]=Step[2];
  391. return self;
  392. }
  393.  
  394. -setData:(SetPref *)Data :(int)Mode :(int)Flags
  395. {
  396.  
  397. data=Data;
  398. mode=Mode;
  399. flags=Flags;
  400. /*
  401. mmx[0]=mmy[0]=mmz[0]=MAXFLOAT;
  402. mmx[1]=mmy[1]=mmz[1]=-MAXFLOAT;
  403.  
  404. for (i=0; i<MAXSETS; i++) {
  405.     for (j=0; j<data[i].ndata; j++) {
  406.         if (data[i].data[j].x<mmx[0]) mmx[0]=data[i].data[j].x;
  407.         if (data[i].data[j].x>mmx[1]) mmx[1]=data[i].data[j].x;
  408.         if (data[i].data[j].y<mmy[0]) mmy[0]=data[i].data[j].y;
  409.         if (data[i].data[j].y>mmy[1]) mmy[1]=data[i].data[j].y;
  410.         if (data[i].data[j].z<mmz[0]) mmz[0]=data[i].data[j].z;
  411.         if (data[i].data[j].z>mmz[1]) mmz[1]=data[i].data[j].z;
  412.     }
  413. }
  414. mmx[1]=(mmx[1]-mmx[0])/2.0;
  415. mmy[1]=(mmy[1]-mmy[0])/2.0;
  416. mmz[1]=(mmz[1]-mmz[0])/2.0;
  417. */
  418. return self;
  419. }
  420.  
  421. -setFlagColors:(RtColor *)col
  422. {
  423. bcopy(col,flagcol,sizeof(RtColor)*5);
  424. return self;
  425. }
  426.  
  427. - setSurfaceType:(N3DSurfaceType)st andDescendants:(BOOL)flag
  428. {
  429. [super setSurfaceType:st andDescendants:flag];
  430. return self;
  431. }
  432.  
  433. -setAng:(float)alt :(float)az :(float)Phi :(float)Aspect :(float)Ambient
  434. {
  435. RtPoint ax;
  436. RtMatrix mx = { { -1.0,0,0,0 }, {0,1.0,0,0}, {0,0,1.0,0}, {0,0,0,1.0} };
  437.  
  438. theta=alt*180.0/M_PI;
  439. chi=az*180.0/M_PI;
  440. phi=Phi*180/M_PI;
  441. aspect=Aspect;
  442. ambient=Ambient;
  443.  
  444. [self setTransformMatrix:mx];
  445.  
  446. [self scale:1.0 :1.0 :Aspect];
  447.  
  448. ax[0]=ax[2]=0; ax[1]=1.0;
  449. [self rotateAngle:phi axis:ax];
  450.  
  451. ax[0]=ax[1]=0; ax[2]=1.0;
  452. [self rotateAngle:chi axis:ax];
  453.  
  454. ax[0]=1.0; ax[1]=ax[2]=0;
  455. [self rotateAngle:theta-90.0 axis:ax];
  456.  
  457. return self;
  458. }
  459.  
  460. - setOver:(int)OMODE
  461. {
  462. Omode=OMODE;
  463. return self;
  464. }
  465.  
  466. -setContour:(float)start :(float)space
  467. {
  468. Cst=start;
  469. Csp=space;
  470. return self;
  471. }
  472. @end
  473.   
  474.